package com.itheima.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.mapper.ClazzMapper;
import com.itheima.mapper.StudentMapper;
import com.itheima.pojo.Clazz;
import com.itheima.pojo.ClazzQueryParam;
import com.itheima.pojo.PageResult;
import com.itheima.pojo.Student;
import com.itheima.service.ClazzService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;

@Service
public class ClazzServiceImpl implements ClazzService {

    @Autowired
    private ClazzMapper clazzMapper;
    @Autowired
    private StudentMapper studentMapper;

    @Override
    public boolean deleteById(Integer id) {
        List<Student> list = studentMapper.findByClazzId(id);
        if (!list.isEmpty()) {
            return false;
        }
        clazzMapper.deleteById(id);
        return true;
    }

    @Override
    public List<Clazz> listAll() {
        return clazzMapper.listAll();
    }

    @Override
    public void update(Clazz clazz) {
        // 修改班级的时候需要更新一下更新时间(update_time字段)
        clazz.setUpdateTime(LocalDateTime.now());
        clazzMapper.update(clazz);
    }

    @Override
    public Clazz findById(Integer id) {
        return clazzMapper.findById(id);
    }

    @Override
    public void insert(Clazz clazz) {
        // 添加班级的时候需要更新一下更新时间(update_time字段)
        clazz.setUpdateTime(LocalDateTime.now());
        clazzMapper.insert(clazz);
    }

    @Override
    public PageResult<Clazz> page(ClazzQueryParam clazzQueryParam) {
        // 开启分页查询,使用PageHelper中的静态方法,参数一代表查询页数,参数二代表每一页的数据最多多少条
        // 分页查询的作用范围只有下一条SQL语句,如果需要查询多次需要多次分页
        PageHelper.startPage(clazzQueryParam.getPage(), clazzQueryParam.getPageSize());
        // 调用Mapper层的方法执行条件查询,分页功能Mybatis会自动拦截并动态代理完成
        List<Clazz> list = clazzMapper.page(clazzQueryParam);
        // 设定一个日期格式转换器,方便将查询到的字符串格式的日期转化成JDK8中的日期,进行比较
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        // begin用来保存每个班级的开始日期,end用来保存每个班级的结束日期
        LocalDate begin;
        LocalDate end;
        // 调用LocalDate的now()方法,返回当前查询时候的日期
        LocalDate now = LocalDate.now();
        // 更新返回的班级结果中的status变量,计算当前班级的状态
        // 在查询阶段的业务层完成,每次查询都会自动计算并且更新当前的班级状态
        for (Clazz clazz : list) {
            // 调用LocalDate中的parse()静态方法,将开始以及结束日期字符串转化成LocalDate的格式
            begin = LocalDate.parse(clazz.getBeginDate(), dateFormatter);
            end = LocalDate.parse(clazz.getEndDate(), dateFormatter);
            // 两步判断,使用成员方法isBefore(),当前日期如果在开班日期之前,则状态为未开班
            // 如果第一个if条件判断不满足,表明当前时间一定在begin之后,无需重复判断
            if (now.isBefore(begin)) {
                clazz.setStatus("未开班");
            } else if (now.isBefore(end)) {
                clazz.setStatus("已开班");
            } else {
                clazz.setStatus("已结课");
            }
        }
        // PageHelper拦截查询语句之后,会将结果封装到Page对象中,所以可以进行强制类型转换
        Page<Clazz> p = (Page<Clazz>) list;
        // 返回一个新创建的PageResult对象,使用全参数构造器为对象赋值
        return new PageResult<>(p.getTotal(), p.getResult());
    }
}
